#include <iostream>
#include <string>
#include <unistd.h>
#include <vector>
#include "Thread.hpp"
#include "LockGuard.hpp"

int tickets = 10000;


// pthread_mutex_t mutex;

// // 简单模拟抢票 --- 使用全局的锁
// void route(const std::string& name)
// {
//     while (true)
//     {
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             // 模拟抢票的时间
//             usleep(1000);
//             printf("who: %s, get a ticket: %d\n", name.c_str(), tickets);
//             tickets--;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
// }


// 简单模拟抢票 --- 使用局部锁
void route(ThreadData* td)
{
    while (true)
    {
        LockGuard localguard(td->GetLock());
        if(tickets > 0)
        {
            // 模拟抢票的时间
            usleep(1000);
            printf("who: %s, get a ticket: %d\n", td->Name().c_str(), tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);
    std::vector<Thread> tids;
    for(int i = 1; i <= 5; i++)
    {
        std::string  name = "thread_"+std::to_string(i);
        ThreadData* data = new ThreadData(name, &mutex);
        Thread t(route, data);
        tids.emplace_back(t);
    }

    // 启动线程
    for(auto& t : tids)
    {
        t.Start();
    }
    sleep(10);

    // 启动线程
    for(auto& t : tids)
    {
        t.Join();
    }
    pthread_mutex_init(&mutex, nullptr);
    return 0;
}

// void Print(const std::string& name)
// {
//     while(true)
//     {
//         std::cout << name << ", is running...." << std::endl;
//         sleep(1);
//     }
// }

// void test1()
// {
//     Thread t("thread_1", Print);
//     // 启动线程
//     t.Start();
//     sleep(10);

//     // 终止线程
//     t.Stop();
//     sleep(3);

//     // 等待线程
//     t.Join();
// }


// void test2()
// {
//     std::vector<Thread> tids;
//     // 创建线程
//     for(int i = 1; i <= num; i++)
//     {
//         Thread t("thread_"+std::to_string(i), Print);
//         tids.emplace_back(t);
//     }

//     // 启动线程
//     for(auto& t : tids)
//     {
//         t.Start();
//     }
//     sleep(10);

//     // 启动线程
//     for(auto& t : tids)
//     {
//         t.Stop();
//     }
//     sleep(3);

//     // 启动线程
//     for(auto& t : tids)
//     {
//         t.Join();
//     }
// }

// int main()
// {
//     //test1(); // 测试创建一个就线程
//     test2(); // 测试创建多个就线程
//     return 0;
// }